#!/bin/bash

# 确保脚本在出错时退出
set -e

# 显示彩色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 设置绝对路径
SYNOLOGY_PATH="/volume1/docker/hello-beer-pos"

echo -e "${GREEN}=========================================${NC}"
echo -e "${GREEN}   Hello Beer POS 系统群晖部署脚本 (改进版)  ${NC}"
echo -e "${GREEN}=========================================${NC}"

# 检查Docker是否已安装
if ! command -v docker &> /dev/null; then
    echo -e "${RED}错误: Docker未安装。请在群晖控制面板中安装Docker。${NC}"
    exit 1
fi

# 拉取最新代码
echo -e "${GREEN}拉取最新代码...${NC}"
cd $SYNOLOGY_PATH
git pull

# 创建必要的目录
echo -e "${GREEN}创建必要的目录...${NC}"
mkdir -p $SYNOLOGY_PATH/logs/nginx $SYNOLOGY_PATH/uploads $SYNOLOGY_PATH/backups $SYNOLOGY_PATH/mysql-data

# 设置目录权限
echo -e "${GREEN}设置目录权限...${NC}"
chmod -R 755 $SYNOLOGY_PATH/logs $SYNOLOGY_PATH/uploads $SYNOLOGY_PATH/backups
chmod -R 777 $SYNOLOGY_PATH/mysql-data

# 检查.env文件是否存在，如果不存在则创建
if [ ! -f "$SYNOLOGY_PATH/.env" ]; then
    echo -e "${YELLOW}未找到.env文件，创建默认配置...${NC}"
    cat > $SYNOLOGY_PATH/.env << EOF
# 数据库配置
DB_PASSWORD=Hello_Beer_2023
DB_NAME=hello_beer

# JWT配置
JWT_SECRET=j8K2p0r5Zt7xW3vA9yB6nM4cD1eF0hG

# 应用配置
NODE_ENV=production
DATABASE_URL=mysql://root:Hello_Beer_2023@hello-beer-db:3306/hello_beer
APP_VERSION=1.0.0
EOF
    echo -e "${GREEN}.env文件已创建，请根据需要修改配置${NC}"
else
    echo -e "${GREEN}已找到.env文件，将使用现有配置${NC}"
fi

# 加载.env文件中的环境变量
if [ -f "$SYNOLOGY_PATH/.env" ]; then
    export $(grep -v '^#' $SYNOLOGY_PATH/.env | xargs)
    echo -e "${GREEN}已加载环境变量配置${NC}"
fi

# 停止并删除现有容器（如果存在）
echo -e "${YELLOW}停止并删除现有容器（如果存在）...${NC}"
docker stop hello-beer-frontend hello-beer-backend hello-beer-db 2>/dev/null || true
docker rm hello-beer-frontend hello-beer-backend hello-beer-db 2>/dev/null || true

# 构建前端静态文件
echo -e "${GREEN}构建前端静态文件...${NC}"
if [ -d "$SYNOLOGY_PATH/frontend" ]; then
  cd $SYNOLOGY_PATH/frontend
  if [ -f "package.json" ]; then
    # 检查是否需要重新构建（比较源文件和构建文件的时间戳）
    NEED_BUILD=false
    if [ ! -d "$SYNOLOGY_PATH/frontend/dist" ] || [ ! "$(ls -A $SYNOLOGY_PATH/frontend/dist)" ]; then
      NEED_BUILD=true
      echo -e "${YELLOW}dist目录不存在或为空，需要构建${NC}"
    elif [ "$SYNOLOGY_PATH/frontend/src" -nt "$SYNOLOGY_PATH/frontend/dist" ]; then
      NEED_BUILD=true
      echo -e "${YELLOW}源文件有更新，需要重新构建${NC}"
    else
      echo -e "${GREEN}前端构建文件是最新的，跳过构建步骤${NC}"
    fi

    if [ "$NEED_BUILD" = true ]; then
      echo -e "${YELLOW}安装前端依赖...${NC}"
      # 使用npm ci代替npm install，速度更快且更可靠
      if [ -f "package-lock.json" ]; then
        npm ci
      else
        npm install
      fi

      echo -e "${YELLOW}构建前端静态文件...${NC}"
      npm run build
    fi

    cd $SYNOLOGY_PATH
  else
    echo -e "${RED}警告: 前端目录中没有找到package.json文件，跳过前端构建${NC}"
  fi
else
  echo -e "${RED}警告: 未找到前端目录，跳过前端构建${NC}"
fi

# 创建网络
echo -e "${GREEN}创建Docker网络...${NC}"
docker network create hello-beer-network 2>/dev/null || true

# 启动容器
echo -e "${GREEN}启动数据库容器...${NC}"
docker run -d --name hello-beer-db \
  --restart always \
  --network hello-beer-network \
  -e MYSQL_ROOT_PASSWORD=${DB_PASSWORD} \
  -e MYSQL_DATABASE=${DB_NAME} \
  -e MYSQL_USER=hello_beer_user \
  -e MYSQL_PASSWORD=${DB_PASSWORD} \
  -v $SYNOLOGY_PATH/mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0 --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

# 等待MySQL启动
echo -e "${YELLOW}等待MySQL启动...${NC}"
sleep 10

# 使用Node官方镜像运行后端，挂载本地代码
echo -e "${GREEN}启动后端容器...${NC}"
docker run -d --name hello-beer-backend \
  --restart always \
  --network hello-beer-network \
  -e NODE_ENV=${NODE_ENV} \
  -e DATABASE_URL=${DATABASE_URL} \
  -e PORT=3100 \
  -e JWT_SECRET=${JWT_SECRET} \
  -v $SYNOLOGY_PATH/backend:/app \
  -v $SYNOLOGY_PATH/logs:/app/logs \
  -v $SYNOLOGY_PATH/uploads:/app/uploads \
  -v $SYNOLOGY_PATH/backups:/app/backups \
  -p 3100:3100 \
  -w /app \
  node:18-alpine sh -c "npm install && npx prisma generate && node src/app.js"

# 使用Nginx镜像运行前端，挂载本地构建文件
echo -e "${GREEN}启动前端容器...${NC}"
docker run -d --name hello-beer-frontend \
  --restart always \
  --network hello-beer-network \
  -p 8081:80 \
  -v $SYNOLOGY_PATH/frontend/dist:/usr/share/nginx/html:ro \
  -v $SYNOLOGY_PATH/nginx/conf.d:/etc/nginx/conf.d:ro \
  -v $SYNOLOGY_PATH/logs/nginx:/var/log/nginx \
  nginx:alpine

# 检查容器状态
echo -e "${GREEN}检查容器状态:${NC}"
docker ps -a

# 获取服务器IP地址，使用更可靠的方法
SERVER_IP=$(ip route get 1 | awk '{print $NF;exit}' 2>/dev/null || hostname -I | awk '{print $1}' 2>/dev/null || echo "服务器IP")

# 完成
echo -e "${GREEN}=========================================${NC}"
echo -e "${GREEN}   部署完成!   ${NC}"
echo -e "${GREEN}=========================================${NC}"
echo -e "${YELLOW}前端访问地址: http://${SERVER_IP}:8081${NC}"
echo -e "${YELLOW}后端API地址: http://${SERVER_IP}:3100${NC}"

echo -e "${GREEN}部署已完成，但还未恢复数据库。如需恢复数据库，请上传backup-full.sql并执行:${NC}"
echo -e "${YELLOW}docker cp backup-full.sql hello-beer-db:/tmp/${NC}"
echo -e "${YELLOW}docker exec hello-beer-db sh -c 'mysql -u root -p\"${DB_PASSWORD}\" ${DB_NAME} < /tmp/backup-full.sql'${NC}"

# 显示后端日志
echo -e "${GREEN}显示后端日志（按Ctrl+C退出）:${NC}"
docker logs -f hello-beer-backend